(function ($) {
    "use strict";
    var defaults = {
        offset:   0,
        duration: 500,
        right:    '40px',
        bottom:   '50px'
    };

    function scrollTo(offset, duration) {
        $('html, body').animate({scrollTop: offset}, duration);
    }

    function Plugin(element, options) {
        this.element = element;
        this.init(options);
    }

    Plugin.prototype.init = function (options) {
        var configs = $.extend({}, defaults, options),
            $element = $(this.element),
            $document = $(document);

        $element.click(function () {
            scrollTo(configs.offset, configs.duration);
            return false;
        })
            .css({
                position: 'fixed',
                right:    configs.right,
                bottom:   configs.bottom,
                cursor:   'pointer',
                display:  'none'
            });

        // Xử lý sự kiện scroll của document để ẩn/hiện phần tử lên đầu trang
        $document.scroll(function () {
            var shown = $element.css('display') !== 'none';
            if ($document.scrollTop() > $(window).height() / 5) {
                if (!shown && $element.queue() < 1) {
                    $element.slideDown(300);
                }
            } else {
                if (shown && $element.queue().length < 1) {
                    $element.slideUp(300);
                }
            }
        });
    };

    // Plugin implement
    $.fn.go_top = function (options) {
        return this.each(function () {
            var token = "jquery.py.goUp",
                plugin = $.data(this, token);
            if (!plugin) {
                plugin = new Plugin(this, options);
                $.data(this, token, plugin);
            }

            return plugin;
        });
    };
}(window.jQuery));